package co.com.travelsoft.ati.client;

import java.math.BigDecimal;
import java.util.Iterator;
import java.util.List;

import co.com.travelsoft.ati.dto.CiudadDto;
import co.com.travelsoft.ati.dto.PaisDto;

import com.google.gwt.core.client.GWT;
import com.google.gwt.event.dom.client.ChangeEvent;
import com.google.gwt.event.dom.client.ChangeHandler;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.FormPanel;
import com.google.gwt.user.client.ui.Grid;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.ListBox;
import com.google.gwt.user.client.ui.TextBox;

public class FormularioRegistroItinerarios extends Composite {
	
	
	private final TravelSoftServiceAsync servicio = GWT
			.create(TravelSoftService.class);
		
	private FormPanel formulario = new FormPanel();
	private TextBox codigoTextBox = new TextBox();
	
	private ListBox paisListBox = new ListBox();
	private ListBox ciudadListBox = new ListBox();	
	
	private TextBox loginTextBox = new TextBox();
	private TextBox nombreTextBox = new TextBox();
	private TextBox correoTextBox = new TextBox();
	private TextBox claveTextBox = new TextBox();
	private Button btnRegistrar = new Button("Registrar");

	public FormularioRegistroItinerarios() {
				
		formulario.setMethod(FormPanel.METHOD_POST);
		formulario.setAction("/myFormHandler");
		initWidget(formulario);
		
		Grid grid = new Grid(6, 2);
		formulario.setWidget(grid);
		grid.setSize("100%", "100%");
				
		Label lblCodigo = new Label("Codigo");
		grid.setWidget(0, 0, lblCodigo);
		grid.setWidget(0, 1, codigoTextBox);
		
		ciudadListBox.setEnabled(false);
		
		//carga el listBox de paises con los datos.
		this.listarPaises();		
		
		//carga el kistBox de ciudades con las ciudades del paise seleccionado.
		listarCiudades();
		
		Label lblPais = new Label("Pais");
		grid.setWidget(1, 0, lblPais);
		grid.setWidget(1, 1, paisListBox);
		
		Label lblCiudad = new Label("Ciudad");
		grid.setWidget(2, 0, lblCiudad);
		grid.setWidget(2, 1, ciudadListBox);
		
		
		Label lblCorreoElectronico = new Label("Fecha Inicial");
		grid.setWidget(3, 0, lblCorreoElectronico);
		grid.setWidget(3, 1, correoTextBox);
		
		Label lblClave = new Label("Fecha Final");
		grid.setWidget(4, 0, lblClave);
		grid.setWidget(4, 1, claveTextBox);
				
		grid.setWidget(5, 1, btnRegistrar);
		
	}

	/**
	 * 
	 */
	private void listarCiudades() {
		
		ciudadListBox.addItem("Ninguno", "0");
		ciudadListBox.setSelectedIndex(0);
		ciudadListBox.setEnabled(false);
		
		/**
		 * Manejador del cambio de paises para cargar el listado de ciudades del pais seleccionado.
		 */
		paisListBox.addChangeHandler(new ChangeHandler() {
			@Override
			public void onChange(ChangeEvent event) {
				
				int i = paisListBox.getSelectedIndex();
				String paisNombre = paisListBox.getItemText(i);
				String paisCodigo = paisListBox.getValue(i);
				
				System.out.println(paisNombre);
				
				PaisDto pais = new PaisDto();
				pais.setNombre(paisNombre);
				pais.setCodigo(new BigDecimal(paisCodigo));
				
				if(!paisCodigo.equals("0")){
					
					Long codigoPais = new Long(paisCodigo);
					servicio.obtenerCiudadesporPais(codigoPais, new AsyncCallback<List <CiudadDto>>() {

						@Override
						public void onFailure(Throwable caught) {
							Window.alert(caught.getMessage());
						}

						@Override
						public void onSuccess(List <CiudadDto> result) {
							if(result == null){
								ciudadListBox.setEnabled(false);
								Window.alert("No existe se encontraron ciudades para el pais seleccionado.");
							}else{
								ciudadListBox.clear();
								ciudadListBox.addItem("Ninguno", "0");
								ciudadListBox.setSelectedIndex(0);
								for (Iterator<CiudadDto> iterator  = result.iterator(); iterator.hasNext();) {
									CiudadDto ciudadDto = iterator.next();
									ciudadListBox.addItem(ciudadDto.getNombre(), ciudadDto.getCodigo().toString());
								}
								ciudadListBox.setEnabled(true);
							}
						}
					})	;
				}else{
					ciudadListBox.clear();
					ciudadListBox.addItem("Ninguno", "0");
					ciudadListBox.setSelectedIndex(0);
					ciudadListBox.setEnabled(false);
				}
			}
		});
	}

	/**
	 * 
	 */
	private void listarPaises() {
		
		paisListBox.addItem("Ninguno", "0");
		paisListBox.setSelectedIndex(0);
		paisListBox.setEnabled(true);
		
		/**
		 * Obtiene el listado de paises registrado en el sistema. 
		 */
		servicio.obtenerPaises(new AsyncCallback<List<PaisDto>>() {

			@Override
			public void onFailure(Throwable caught) {
				Window.alert(caught.getMessage());
			}

			@Override
			public void onSuccess(List <PaisDto> result) {
				if(result == null){
					Window.alert("No existen paises registrados en el sistema.");
				}else{
					for (Iterator<PaisDto> iterator  = result.iterator(); iterator.hasNext();) {
						PaisDto paisDto = iterator .next();
						paisListBox.addItem(paisDto.getNombre(), paisDto.getCodigo().toString());
					}
				}
			}
		})	;
	}

}
